]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
workspace: Fix bad window positions with small windows
authorJasper St. Pierre <jstpierre@mecheye.net>
Thu, 28 Feb 2013 21:08:19 +0000 (16:08 -0500)
committerJasper St. Pierre <jstpierre@mecheye.net>
Thu, 28 Feb 2013 23:15:15 +0000 (18:15 -0500)
This can happen if you open two or three terminal windows, and then
open the overview -- they're not centered. The issue is that because
of the WINDOW_CLONE_MAXIMUM_SCALE clamping, the scale that is being
laid out is different from the scale that the layout was calculated
for.

Implement and document a hack-ish solution which simply keeps the
scale for the layout as originally calculated, but centers the
windows inside the cell.

https://bugzilla.gnome.org/show_bug.cgi?id=694902

js/ui/workspace.js

index abc42202a95b7f3095f23717f22477808dc2483b..a3cd6a87095492ee59ee25ee75e4f51d0dd35145 100644 (file)
@@ -631,8 +631,9 @@ const WindowPositionFlags = {
 // must always be true. This is for each individual window -- while we
 // could adjust layoutScale to make the largest thumbnail smaller than
 // WINDOW_CLONE_MAXIMUM_SCALE, it would shrink windows which are already
-// under the inequality. This is a difficult issue, and right now is
-// unsolved -- it will generate bad layouts.
+// under the inequality. To solve this, we simply cheat: we simply keep
+// each window's "cell" area to be the same, but we shrink the thumbnail
+// and center it horizontally, and align it to the bottom vertically.
 
 const LayoutStrategy = new Lang.Class({
     Name: 'LayoutStrategy',
@@ -770,13 +771,17 @@ const LayoutStrategy = new Lang.Class({
                 let window = row.windows[j];
 
                 let s = scale * this._computeWindowScale(window);
+                let cellWidth = window.actor.width * s;
+                let cellHeight = window.actor.height * s;
+
                 s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE);
-                let width = window.actor.width * s;
-                let height = window.actor.height * s;
-                let y = row.y + row.height - height;
+                let cloneWidth = window.actor.width * s;
+
+                let cloneX = x + (cellWidth - cloneWidth) / 2;
+                let cloneY = row.y + row.height - cellHeight;
 
-                slots.push([x, y, s, window]);
-                x += width + this._columnSpacing;
+                slots.push([cloneX, cloneY, s, window]);
+                x += cellWidth + this._columnSpacing;
             }
         }
         return slots;